#include "systeminit.h"

typedef unsigned int uint32;

static void SetSysClock(void){
	volatile uint32 HSERDY = 0,timeout = 0;
	
	/*外部高速时钟使能*/
	RCC_CR |= (uint32)0x00010000;
	/*检测RCC_CR寄存器的位17(HSERDY)，外部高速时钟就绪标志*/
	/*判断是否初始化超时*/
	do{
		HSERDY = RCC_CR & 0x00020000;
		timeout++;
	}while((HSERDY == 0) && (timeout != 0x500));
	/*如果就绪完毕，设置时钟*/
	if(HSERDY == 0x00020000){
		/*FLASH_ACR寄存器的位4,预取缓冲区使能*/
		FLASH_ACR |= 0x00000010;
		/*FLASH_ACR寄存器的位2~0,设置时延*/
		FLASH_ACR &= 0xfffffff8;
		FLASH_ACR |= 0x00000002;
		/*设置时钟配置寄存器(RCC_CFGR)，设置预分频器*/
		RCC_CFGR |= 0x00000000;/*设置AHB预分频器不分频，HCLK=72MHz*/
		RCC_CFGR |= 0x00000000;/*设置APB2预分频器不分频，PCLK2=72MHz*/
		RCC_CFGR |= 0x00000400;/*设置APB1预分频器2分频，PCLK1=36MHz*/
		/*设置时钟配置寄存器(RCC_CFGR)，配置PLL*/
		RCC_CFGR &= 0xffc0ffff;
		RCC_CFGR |= 0x001d0000;
		/*使能PLL*/
		RCC_CR |= 0x01000000;
		/*等待PLL就绪*/
		while((RCC_CR & 0x02000000) == 0);	
		/*设置时钟配置寄存器(RCC_CFGR)，PLL输出作为系统时钟*/
		RCC_CFGR &= 0xfffffffc;
		RCC_CFGR |= 0x00000002;
		/*等待系统时钟切换就绪*/
		while((RCC_CFGR & (uint32)0x0000000c) != (uint32)0x8);
	}else{/*时钟设置不成功，进入死循环*/
		while(1);
	}
	
	return;
}

void SystemInit(void){
	/*将CR寄存器的位0置1,开启内部8MHz振荡器*/
	RCC_CR |= (uint32)0x00000001;
	/*清0 RCC_CFGR寄存器的SW,HPRE,PPRE1,PPRE2,ADCPRE和MCO位*/
	RCC_CFGR &= (uint32)0xf8ff0000;
	/*清0 RCC_CR寄存器的HSEON, CSSON和PLLON位*/
	RCC_CR &= (uint32)0xfef6ffff;
	/*清0 RCC_CR寄存器的HSEBYP位*/
	RCC_CR &= (uint32)0xfffbffff;
	/*清0 RCC_CFGR寄存器的PLLSRC, PLLXTPRE, PLLMUL和USBPRE/OTGFSPRE位*/
	RCC_CFGR &= (uint32)0xff80ffff;
	/*禁止所有的中断和清除挂起标志位*/
	RCC_CIR = (uint32)0x009f0000;
	/*SetSysClock函数用于设置系统时钟频率为72MHz，HCLK,PCLK2和PCLK1的预分频器*/
	SetSysClock();
	
	return;
}
